// 销售订单模型定义文件
// 该文件定义了销售订单数据表的结构和相关配置

// 引入Sequelize ORM框架
// Sequelize: ORM框架，用于数据库操作
const Sequelize = require('sequelize');

/**
 * 定义销售订单模型
 * @param {Sequelize} sequelize - Sequelize实例
 * @param {DataTypes} DataTypes - Sequelize数据类型
 * @returns {Model} 销售订单模型
 * 
 * 该函数定义了sales_orders表的结构和配置
 * 包括字段定义、索引、时间戳等配置
 * 
 * Sequelize模型定义说明：
 * 1. 使用sequelize.define方法定义数据表模型
 * 2. 第一个参数是表名
 * 3. 第二个参数是字段定义对象
 * 4. 第三个参数是模型配置对象
 */
module.exports = function(sequelize, DataTypes) {
  // 使用sequelize.define方法定义模型
  // sequelize.define(): Sequelize定义模型的方法
  return sequelize.define('sales_orders', {
    // 订单ID字段 - 主键，自增
    // order_id: 订单唯一标识符，主键，自动递增
    order_id: {
      autoIncrement: true,              // 设置为自增字段
      autoIncrementIdentity: true,      // PostgreSQL的自增标识
      type: DataTypes.INTEGER,          // 数据类型为整数
      allowNull: false,                 // 不允许为空
      primaryKey: true                  // 设置为主键
    },
    
    // 订单编号字段 - 格式为DD+日期+4位随机数
    // order_number: 订单编号，唯一标识一个订单
    order_number: {
      type: DataTypes.STRING(20),       // 数据类型为字符串，最大长度20
      allowNull: true,                  // 允许为空（在创建时会自动生成）
      unique: true                      // 唯一约束，确保订单编号不重复
    },
    
    // 客户ID字段 - 外键，关联到客户表
    // customer_id: 关联客户表的外键字段
    customer_id: {
      type: DataTypes.INTEGER,          // 数据类型为整数
      allowNull: false                  // 不允许为空
    },
    
    // 订单日期字段
    // order_date: 订单创建日期
    order_date: {
      type: DataTypes.DATEONLY,         // 数据类型为日期（不包含时间）
      allowNull: false                  // 不允许为空
    },
    
    // 订单总金额字段
    // total_amount: 订单总金额
    total_amount: {
      type: DataTypes.DECIMAL,          // 数据类型为十进制定点数
      allowNull: false                  // 不允许为空
    },
    
    // 订单状态字段
    // status: 订单状态，用于跟踪订单处理进度
    status: {
      type: DataTypes.INTEGER,          // 数据类型为整数
      allowNull: false,                 // 不允许为空
      defaultValue: 1                   // 默认值为1（待处理）
    },
    
    // 备注字段
    // notes: 订单备注信息
    notes: {
      type: DataTypes.TEXT,             // 数据类型为文本
      allowNull: true                   // 允许为空
    },
    
    // 产品ID字段 - 外键，关联到产品表
    // product_id: 关联产品表的外键字段
    product_id: {
      type: DataTypes.INTEGER,          // 数据类型为整数
      allowNull: false                  // 不允许为空
    },
    
    // 数量字段
    // quantity: 订购产品数量
    quantity: {
      type: DataTypes.INTEGER,          // 数据类型为整数
      allowNull: false,                 // 不允许为空
      defaultValue: 1                   // 默认值为1
    },
    
    // 单价字段
    // unit_price: 产品单价
    unit_price: {
      type: DataTypes.DECIMAL,          // 数据类型为十进制定点数
      allowNull: false                  // 不允许为空
    },
    
    // 小计字段
    // subtotal: 订单小计金额（数量*单价）
    subtotal: {
      type: DataTypes.DECIMAL,          // 数据类型为十进制定点数
      allowNull: false                  // 不允许为空
    },
    
    // 婴儿名称字段
    // baby_name: 婴儿姓名
    baby_name: {
      type: DataTypes.STRING(100),      // 数据类型为字符串，最大长度100
      allowNull: true                   // 允许为空
    },
    
    // 照片字段 - 0表示无，1表示有
    // photo: 是否包含照片服务
    photo: {
      type: DataTypes.INTEGER,          // 数据类型为整数
      allowNull: true,                  // 允许为空
      defaultValue: 0                   // 默认值为0（无）
    },
    
    // 手脚印字段 - 0表示无，1表示有
    // hand_foot_print: 是否包含手脚印服务
    hand_foot_print: {
      type: DataTypes.INTEGER,          // 数据类型为整数
      allowNull: true,                  // 允许为空
      defaultValue: 0                   // 默认值为0（无）
    },
    
    // 胎毛字段 - 0表示无，1表示有
    // baby_hair: 是否包含胎毛服务
    baby_hair: {
      type: DataTypes.INTEGER,          // 数据类型为整数
      allowNull: true,                  // 允许为空
      defaultValue: 0                   // 默认值为0（无）
    },
    
    // 脐带字段 - 0表示无，1表示有
    // umbilical_cord: 是否包含脐带服务
    umbilical_cord: {
      type: DataTypes.INTEGER,          // 数据类型为整数
      allowNull: true,                  // 允许为空
      defaultValue: 0                   // 默认值为0（无）
    },
    
    // 快递信息ID字段 - 外键，关联到快递信息表
    // express_id: 关联快递信息表的外键字段
    express_id: {
      type: DataTypes.INTEGER,          // 数据类型为整数
      allowNull: true                   // 允许为空
    },
    
    // 收款状态字段 - 0表示未收款，1表示已收款
    // is_paid: 收款状态，用于财务管理
    payment_status: {
      type: DataTypes.INTEGER,          // 数据类型为整数（0: 未收款, 1: 部分收款, 2: 已收款）
      allowNull: true,                  // 允许为空
      defaultValue: 0                   // 默认值为0（未收款）
    },
    
    // 出库记录ID字段 - 外键，关联到出库记录表
    // outbound_id: 关联出库记录表的外键字段
    // outbound_id: {
    //   type: DataTypes.INTEGER,          // 数据类型为整数
    //   allowNull: true                   // 允许为空
    // }
  }, {
    tableName: 'sales_orders',          // 指定数据表名
    schema: 'public',                   // 指定数据库模式
    hasTrigger: true,                   // 表具有触发器
    timestamps: true,                   // 启用时间戳，自动维护created_at和updated_at字段
    createdAt: 'created_at',            // 指定创建时间字段名
    updatedAt: 'updated_at',            // 指定更新时间字段名
    indexes: [                          // 索引定义，提高查询性能
      {
        name: "sales_orders_pkey",      // 主键索引
        unique: true,                   // 唯一索引
        fields: [                       // 索引字段
          { name: "order_id" },         // 索引字段为订单ID
        ]
      },
    ]
  });
};